<?php
/**
 * Created by PhpStorm.
 * User: DELL
 * Date: 2018/7/12
 * Time: 11:03
 */
namespace app\common\lib;
use think\Cache;

class IAuth
{
    //设置密码
    public static function setPassword($data)
    {
        return md5($data);
    }

    /**
     * 告诉前端工程师加密的3个步骤
     *
     * 生成每次请求的sign
     * @param array $data
     * return string
     */
    public static function setSign($data = [])
    {
        // 1.按字段排序
        ksort($data);
        //2. 拼接字符串数据  & 形如 id=1&name=lbj&age=34
        $string = http_build_query($data);
        //3.通过aes来加密
        $string = (new \app\common\lib\Aes())->encrypt($string);

        return $string;
    }

    /**
     * 检查sign是否正常,
     * @param $data   头部请求数据
     * 解密后的相当于  app_type=ios&cersion=1&device=iphoneX
     */
    public static function checkSignPass($data)
    {
        $str = (new Aes())->decrypt($data['sign']);
        if(empty($str))
        {
            return false;
        }

        parse_str($str,$arr);
        //halt($arr);                                              //这里$data中的did并没有进行加密,传的是明文
        if(!is_array($arr) || empty($arr['did']) || $arr['did'] != $data['did'])
        {
            return false;
        }
        //如果是在开发模式下,就跳过这个校验环节
        if(!config('app_debug'))
        {
            //验证sign是否过期
            if(time() - ceil($arr['time'] / 1000 ) > config('app.app_sign_time'))
            {
                return false;
            }

            //验证sign是否已经被请求过了  sign唯一性判定
            if(Cache::get($data['sign']))
            {
                return false;
            }
        }
        return true;
    }

    /**
     * 设置登录的token  唯一性
     * @param string $phone
     * @return string
     */
    public function setAppLoginToken($phone = '')
    {
        $str = md5(uniqid(md5(microtime(true)),true));
        $str = sha1($str.$phone);
        return $str;
    }
    
}